home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / lang_c / environ / setvar.asm < prev   
Assembly Source File  |  1985-09-15  |  4KB  |  168 lines

  1. PAGE    58,132
  2. ;    FILE:    SETVAR.ASM
  3. ;
  4. ;        THIS FILE WAS PRODUCED BY RE-CONSTITUTING AN EXE FILE
  5. ;    DOWNLOADED FROM THE CLM BBS
  6. ;
  7. ;        SETVAR WAITS FOR THE USER TO INPUT A STRING, AND STORES
  8. ;    IT IN THE STRING ENVIRONMENT UNDER A NAME SPECIFIED ON THE
  9. ;    COMMAND LINE.
  10. ;
  11. CODE    SEGMENT    BYTE PUBLIC
  12.     ASSUME    CS:CODE,DS:CODE
  13.  
  14.             ;DEFINE SOME SYMBOLS IN THE PSP
  15.     ORG    014H
  16. PARPSP    DW    ?
  17.     ORG    080H
  18. LENTH    DB    ?
  19. COMLINE    DB    ?
  20.  
  21.     ORG    0100H
  22. START:    JMP    REAL_START
  23.         ;DATA IS STORED HERE
  24.  
  25. ENVSIZE    DW    0
  26. NAMELEN    DW    0
  27. BUFFER    DB    07FH    ;BUFFER FOR SENDING TO BUFFER KEYBOARD SYSCALL
  28. CHARS    DB    0    ;ACTUAL NUMBER OF CHARACTERS TYPED
  29.     DB    07FH DUP ( 0 )        ;THE STRING DATA IS STORED HERE.
  30.  
  31.         ;CODE STARTS HERE
  32. REAL_START:
  33.     MOV     BX,WORD PTR LENTH    ;GET LENGTH OF COMMAND STRING
  34.     XOR    BH,BH
  35.     CMP     BX,1            ;MUST BE GREATER THAN 1.
  36.     JG      IS_NAME            ;IF NOT, THEY FORGOT TO SPECIFY
  37.     JMP     EXIT            ;THE STRING NAME, SO EXIT.
  38.  
  39. IS_NAME:                ;L0196:
  40.     MOV     NAMELEN,BX
  41.     MOV     BYTE PTR [BX+0081H],03DH ;STORE AN = AT END OF NAME
  42.     MOV     DX,PARPSP        ;GET THE CALLING PROGRAMS PSP SEG
  43.     MOV     ES,DX            ;PUT IT IN ES
  44.     MOV     BX,WORD PTR ES:[002CH]    ;GET THE CALLERS ENVIRONMENT STRING
  45.     CMP     BX,0            ;IF IT IS ZERO,
  46.     JNZ     L01BC            ;
  47.     MOV     BX,DX            ;THEN USE THE PSP ADDRESS
  48.     DEC     BX            ;MINUS 16 (IT'S A SEGMENT VALUE)
  49.     MOV     ES,BX            ;AS THE ADDRESS OF A PLACE TO
  50.     ADD     BX,WORD PTR ES:[0003]    ;FETCH THE ADDRESS OF AN ENVIRONMENT
  51.     ADD     BX,2            ;STRING! (I DON'T GET THIS?!...MFH)
  52. L01BC:
  53.     MOV     DX,BX            ;PUT ENVIRONMENT STRING ADDRESS IN DX
  54.     DEC     DX            ;BACKUP 16 BYTES FROM THAT,
  55.     MOV     ES,DX            ;USE THAT AS AN ADDRESS OF A PLACE TO
  56.     MOV     CX,WORD PTR ES:[0003]    ;FETCH THE ADDRESS OF THE ENVIRONMENT SIZE?
  57.     SHL     CX,1            ;MULTIPLY THAT BY 16
  58.     SHL     CX,1            ;TO GET THE ENVIRONMENT STRING SIZE.
  59.     SHL     CX,1
  60.     SHL     CX,1
  61.     MOV     ENVSIZE,CX    ;AND STORE IT AWAY.
  62.     MOV     ES,BX        ;PUT ENVIRONMENT SEG IN ES.
  63.     SUB     DI,DI        ;INITIALIZE DI AND BX TO ZERO
  64.     MOV     BX,DI
  65.     MOV     DX,CX        ;INITIALIZE CX TO THE ENVIRONMENT SIZE
  66. L01DA:
  67.     CMP     DI,ENVSIZE
  68.     JNB     L022B        ;
  69.     MOV     AL,03DH
  70.     CALL    S0295        ;
  71.     JNZ     L022B        ;
  72.     MOV     BX,DI
  73.     MOV     DX,CX
  74.     DEC     DI
  75.     MOV     CX,NAMELEN
  76.     MOV     SI,0081H
  77.     ADD     SI,NAMELEN
  78.     STD
  79.     REPZ    CMPSB
  80.     JNZ     L01DA        ;
  81.     INC     DI
  82.     MOV     BX,DI
  83.     MOV     AL,0
  84.     ADD     DX,NAMELEN
  85.     CALL    S0295        ;
  86.     CMP     AL,ES:[DI]
  87.     JNZ     L0216        ;
  88.     MOV     DI,BX
  89.     MOV     BYTE PTR ES:[DI],00
  90.     JMP     L022B        ;
  91.  
  92. L0216:
  93.     MOV     SI,DI
  94.     MOV     CX,ENVSIZE
  95.     SUB     CX,DI
  96.     MOV     AX,ES
  97.     MOV     DS,AX
  98.     MOV     DI,BX
  99.     CLD
  100.     REPZ MOVSB
  101.     MOV     AX,CS
  102.     MOV     DS,AX
  103. L022B:
  104.     SUB     DI,DI
  105.     MOV     CX,ENVSIZE
  106.     MOV     AX,0
  107. L0234:
  108.     CMP     AX,ES:[DI]
  109.     JZ      L023F        ;
  110.     INC     DI
  111.     LOOP    L0234        ;
  112.     JMP     EXIT        ;
  113.  
  114. L023F:
  115.     INC     DI
  116.     MOV     BX,ENVSIZE        ;GET SIZE REMAINING ENVIRONMENT
  117.     SUB     BX,DI
  118.     SUB     BX,NAMELEN        ;SUBTRACT SIZE OF NAME,
  119.     JLE     EXIT            ;QUIT IF NOT ENUF ROOM.
  120.     SUB     BX,2            ;LEAVE ROOM FOR 2 NULS,
  121.     JLE     EXIT            ;QUIT IF DROPS BELOW ZERO.
  122.     CMP     BX,07FH            ;LIMIT THE SIZE IF THE STRING
  123.     JLE     NO_LIMIT        ;TO 7F BYTES.
  124.     MOV     BX,007FH
  125. NO_LIMIT:                ;L0259:
  126.     MOV     DX,OFFSET BUFFER    ;GET ADDRESS OF MSDOS REQUIRED
  127.     MOV     SI,DX            ;BUFFER
  128.     MOV     [SI],BL            ;STORE MAX STRING SIZE
  129.     MOV     AH,0AH
  130.     INT     21H        ;BUFFERED KEYBOARD INPUT INTERUPT
  131.  
  132.     MOV     DL,0AH            ;ECHO A CARRAGE RETURN
  133.     MOV     AH,02            ;AFTER GETTING A STRING
  134.     INT     21H            ;FROM THE USER
  135.  
  136.     XOR     CH,CH
  137.     MOV     CL,[SI+01]
  138.     CMP     CL,0
  139.     JZ      EXIT        ;
  140.     INC     SI
  141.     INC     SI
  142.     MOV     BX,SI
  143.     MOV     DX,CX
  144.     MOV     CX,NAMELEN
  145.     MOV     SI,0082H
  146.     CLD
  147.     REPZ MOVSB
  148.     MOV     SI,BX
  149.     MOV     CX,DX
  150.     REPZ MOVSB
  151.     MOV     AX,0
  152.     STOSW
  153. EXIT:
  154.     MOV     AH,04CH        ;EXIT WITH STATUS CALL, STATUS IS THE
  155.     MOV     AL,CHARS    ;NUMBER OF CHARS ENTERED BY USER.
  156.     INT     21H        ;RETURN THAT AS YOUR EXIT VALUE.
  157.  
  158. S0295:
  159.     MOV     DI,BX
  160.     MOV     CX,DX
  161.     CLD
  162.     REPNZ SCASB
  163.     RET
  164.  
  165. CODE    ENDS
  166.  
  167.     END    START
  168.